#include "lvgl_photo_brower.h"

DI_P Demo_Init()
{
    printf("例程初始化成功！\n");
    DI_P dip = (DI_P)malloc(sizeof(DI));
    if(dip == (DI_P)NULL)
    {
        perror("malloc faile ...");
        return  (DI_P)-1;
    }

    //清空堆空间
    memset(dip,0,sizeof(DI));

    dip->main_screen = lv_obj_create(NULL);
    // dip->album_left  = lv_obj_create(dip->main_screen);
    // dip->game_right  = lv_obj_create(dip->main_screen);

    dip->exit_mask = 1;
    lv_scr_load(dip->main_screen);

    //创建目录按钮信息链表的头节点
    if((dip->dir_btn_inf_list_head = Create_Dir_Btn_Node()) == (BTN_LINK)-1)
    {
        printf("创建目录按钮信息链表的头节点失败！\n");
        return  (DI_P)-1;
    }
    return dip;
} 


/************************************* */

bool Show_Main_Screen(DI_P dip, const char *dir_path) {
    /**************************** */
    // 清理可能残留的对象
    lv_obj_clean(dip->main_screen);

    // 创建一个列表用于显示文件路径
    lv_obj_t *list = lv_list_create(dip->main_screen);
    lv_obj_set_size(list, 220, 260); // 设置列表的大小
    lv_obj_align(list, LV_ALIGN_TOP_LEFT, 30, 50); // 设置列表的位置
    // 设置列表背景为透明
    lv_obj_set_style_bg_opa(list, LV_OPA_TRANSP, LV_PART_MAIN);
    // lv_obj_set_style_bg_color(list, lv_color_hex(0x000000), LV_PART_MAIN); // 可选：设置背景颜色为黑色
    // 隐藏滚动条
    // 确保列表内容不超出容器
    lv_obj_set_flex_flow(list, LV_FLEX_FLOW_COLUMN);  // 使用列布局，避免横向滑动
 
    // 打开目录并读取文件信息
    DIR *dp = opendir(dir_path);
    if (dp != NULL) {
        struct dirent *entry;
        int file_count = 0;
        char file_paths[100][256]; // 假设最多100个文件，每个路径最大256字符
 
        // 遍历目录并记录文件路径
        while ((entry = readdir(dp)) != NULL) {
            if (entry->d_type == 8) { // 仅处理普通文件
                char *ext = strrchr(entry->d_name, '.');
                if (ext && (strcmp(ext, ".png") == 0 || strcmp(ext, ".jpg") == 0)) {
                    snprintf(file_paths[file_count], sizeof(file_paths[file_count]), "%s/%s", dir_path, entry->d_name);
                    file_count++;
                }
            }
        }
 
        // 显示文件数量
        char count_text[50];
        snprintf(count_text, sizeof(count_text), "Total Images: %d", file_count);
        lv_obj_t *count_label = lv_label_create(dip->main_screen);
        lv_label_set_text(count_label, count_text);
        lv_obj_align_to(count_label, dip->main_screen, LV_ALIGN_TOP_LEFT, 15, 10);
 
        // 显示每个文件的路径
        for (int i = 0; i < file_count; i++) {
            lv_obj_t *btn = lv_list_add_btn(list, NULL, file_paths[i]);
            lv_obj_set_size(btn, lv_obj_get_width(list), 40); // 设置每个按钮的高度
            lv_obj_set_style_bg_opa(btn, LV_OPA_TRANSP, LV_PART_MAIN);
        }
 
        if (closedir(dp) == -1) {
            perror("closedir failed");
        }
    } else {
        perror("opendir failed");
    }
    /***************************** */
 
    // 清理可能残留的对象
    // lv_obj_clean(dip->main_screen);
 
    // 创建按钮和其他主界面元素
    lv_obj_t *album_btn = lv_btn_create(dip->main_screen);
    lv_obj_t *game_btn = lv_btn_create(dip->main_screen);
    lv_obj_t *main_txt = lv_label_create(dip->main_screen);
    lv_obj_t *exit_btn = lv_btn_create(dip->main_screen);  // 创建退出按钮
    lv_obj_set_size(exit_btn, 50, 50);  // 设置按钮大小
    lv_obj_set_pos(exit_btn, 740, 10);  // 设置按钮位置，右上角（根据需要调整坐标）
 
    // 设置按钮的背景颜色
    lv_obj_set_style_bg_color(exit_btn, lv_color_hex(0xFF0000), LV_PART_MAIN);  // 设置背景为红色
    lv_obj_set_style_bg_opa(exit_btn, LV_OPA_90, LV_PART_MAIN);  // 设置背景透明度
    lv_obj_set_style_radius(exit_btn, 25, LV_PART_MAIN);  // 设置圆形按钮
 
    // 设置按钮的文本
    lv_obj_t *label = lv_label_create(exit_btn);  // 创建文本标签
    lv_label_set_text(label, "EXIT");  // 设置文本为“退出”
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);  // 文本居中
 
    // 添加按钮点击事件
    lv_obj_add_event_cb(exit_btn, exit_btn_event_handler_main, LV_EVENT_CLICKED, dip);
 
    // 设置左边album的大小
    lv_obj_set_size(album_btn, 220, 150);
    // 设置左边album的位置
    lv_obj_set_pos(album_btn, 30, 300);
 
    SI_P show_need = (SI_P)malloc(sizeof(SI));
    show_need->dip = dip;
    show_need->obj_dir_path = "/pic";
 
    lv_obj_t *img_album = lv_img_create(album_btn);  // 在按钮上创建图标
    lv_img_set_src(img_album, "S:/pic/album.png");  // 设置游戏图标（你可以选择任意的图标图片）
    lv_obj_align(img_album, LV_ALIGN_CENTER, 0, 0);  // 图标居中显示
    lv_obj_add_event_cb(album_btn, Show_Dir_List, LV_EVENT_CLICKED, show_need);
 
    // 设置右边game的大小
    lv_obj_set_size(game_btn, 220, 150);
    // 设置右边game的位置
    lv_obj_set_pos(game_btn, 550, 300);
 
    // 设置按钮的图标（假设是游戏图标）
    lv_obj_t *img_game = lv_img_create(game_btn);  // 在按钮上创建图标
    lv_img_set_src(img_game, "S:/pic/game.png");  // 设置游戏图标（你可以选择任意的图标图片）
    lv_obj_align(img_game, LV_ALIGN_CENTER, 0, 0);  // 图标居中显示
    lv_obj_add_event_cb(game_btn, game_ui, LV_EVENT_CLICKED, dip);
    
 
    lv_label_set_text(main_txt, "Main interface of the entertainment terminal");
 
    // 设置字体大小
    lv_obj_set_style_text_font(main_txt, &lv_font_montserrat_20, LV_PART_MAIN);
 
    // 设置字体颜色
    lv_obj_set_style_text_color(main_txt, lv_color_hex(0x4B9CD3), LV_PART_MAIN);  // 设置字体颜色为蓝色
 
    // 对齐方式设置为居中，并稍微偏移
    lv_obj_align(main_txt, LV_ALIGN_TOP_MID, 0, 20);  // 顶部居中，偏移20像素
 
    return true;
}

/************************************ */

BTN_LINK Create_Dir_Btn_Node()//创建节点
{
    BTN_LINK new_node = (BTN_LINK)malloc(sizeof(BTN_NODE));
    if(new_node == (BTN_LINK)NULL)
    {
        perror("malloc btn node");
        return (BTN_LINK)-1;
    }

    memset(new_node,0,sizeof(BTN_NODE));

    new_node->next = new_node;
    new_node->prev = new_node;

    return new_node;
}

bool Add_Dir_Btn_Node(DI_P dip,BTN_LINK new_node)  //头插法
{
    if(dip == (DI_P)NULL || dip->dir_btn_inf_list_head == (BTN_LINK)NULL) 
    {
        printf("地址异常！\n");
        return false;
    }



    new_node->next                         = dip->dir_btn_inf_list_head->next;
    dip->dir_btn_inf_list_head->next->prev = new_node;

    new_node->prev                         = dip->dir_btn_inf_list_head;
    dip->dir_btn_inf_list_head->next       = new_node;

    return true;
}

bool Show_File_Btn(BTN_LINK btn_node,int btn_x,int btn_y)
{

    //基于子屏幕为父类创建对应文件按钮
    lv_obj_t * file_btn = lv_btn_create(btn_node->dip->main_screen);
    char buffer[100];
    memset(buffer,0,sizeof(buffer));
    sprintf(buffer, "%s%s", "S:/pic/", btn_node->file_name);
    lv_obj_t * img_game = lv_img_create(file_btn);  // 在按钮上创建图标
    lv_img_set_size_mode(img_game, LV_SIZE_CONTENT);  // 让图片自适应内容大小
    lv_img_set_zoom(img_game, 256 / 2);  // 设置缩放级别


    lv_img_set_src(img_game, buffer);  // 设置游戏图标（你可以选择任意的图标图片）
    lv_obj_align(img_game, LV_ALIGN_CENTER, 0, 0);  // 图标居中显示
    

    //设置按钮的大小
    lv_obj_set_size(file_btn,FILE_BTN_W,FILE_BTN_H);
    // lv_obj_set_style_bg_opa(file_btn, LV_OPA_TRANSP, 0);  // 背景透明
    // 设置按钮透明
    lv_obj_set_style_bg_opa(file_btn, LV_OPA_TRANSP, 0);  // 背景透明



    //设置按钮的位置
    lv_obj_set_pos(file_btn,btn_x,btn_y);

    lv_obj_t * txt = lv_label_create(file_btn);
    lv_label_set_text(txt,btn_node->file_name);
    lv_label_set_long_mode(txt,LV_LABEL_LONG_SCROLL_CIRCULAR);
    // lv_obj_center(txt);
    lv_obj_align(txt, LV_ALIGN_BOTTOM_LEFT, 0, 0);
    lv_obj_set_width(txt,200);
    lv_obj_set_height(txt,20);

    // 为按钮添加点击事件
    lv_obj_add_event_cb(file_btn, File_Btn_Push_Task, LV_EVENT_SHORT_CLICKED, btn_node);
    lv_obj_add_event_cb(file_btn, File_Btn_Del_Push_Task, LV_EVENT_LONG_PRESSED, btn_node);


    return true;
}

void File_Btn_Push_Task(lv_event_t * e)
{
    BTN_LINK btn_node = (BTN_LINK)e->user_data;
    if (btn_node == NULL)
    {
        return;
    }
    
    printf("你按了文件按钮: %s\n", btn_node->file_name);

    // 检查文件扩展名是否为图片格式（例如 .jpg, .png, .bmp）
    const char * file_name = btn_node->file_name;
    if (strstr(file_name, ".png") )
    {
        printf("文件是图片，准备显示：%s\n", file_name);
        // 你可以根据文件的路径来加载图片
        Show_Image(file_name, btn_node->dip,btn_node);
        
    }
    else
    {
        printf("该文件不是图片\n");
    }
}

void Show_Image(const char * file_name, DI_P dip,BTN_LINK btn_inf_node)
{
    
    // 假设图片存储路径为：/images/
    char full_path[256];
    snprintf(full_path, sizeof(full_path), "S:/pic/%s", file_name);
    lv_obj_clean(dip->main_screen);

    // 创建一个新的屏幕来显示图片
    lv_obj_t * img_obj = lv_img_create(dip->main_screen);  // 在文件屏幕上创建一个图片对象
    lv_img_set_src(img_obj, full_path);  // 加载静态图片
    lv_obj_center(img_obj);

    lv_obj_t * exit_btn_1 = lv_btn_create(dip->main_screen);  // 创建退出按钮
    lv_obj_set_size(exit_btn_1, 50, 50);  // 设置按钮大小
    lv_obj_set_pos(exit_btn_1, 740, 10);  // 设置按钮位置，右上角（根据需要调整坐标）

    // 设置按钮的背景颜色
    lv_obj_set_style_bg_color(exit_btn_1, lv_color_hex(0xFF0000), LV_PART_MAIN);  // 设置背景为红色
    lv_obj_set_style_bg_opa(exit_btn_1, LV_OPA_90, LV_PART_MAIN);  // 设置背景透明度
    lv_obj_set_style_radius(exit_btn_1, 25, LV_PART_MAIN);  // 设置圆形按钮

    // 设置按钮的文本
    lv_obj_t * label = lv_label_create(exit_btn_1);  // 创建文本标签
    lv_label_set_text(label, "EXIT");  // 设置文本为“退出”
    lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);  // 文本居中
    /**************************/
    // 上一页和下一页按钮
    lv_obj_t * prev_btn = lv_btn_create(dip->main_screen);
    lv_obj_set_size(prev_btn, 50, 50);
    lv_obj_set_pos(prev_btn, 740, 70);  // 设置上一页按钮位置，左上角
    lv_obj_set_style_bg_color(prev_btn, lv_color_hex(0x00FF00), LV_PART_MAIN);  // 设置背景为绿色
    lv_obj_set_style_bg_opa(prev_btn, LV_OPA_90, LV_PART_MAIN);  
    lv_obj_set_style_radius(prev_btn, 25, LV_PART_MAIN);  

    lv_obj_t * prev_label = lv_label_create(prev_btn);  // 创建上一页按钮上的文本
    lv_label_set_text(prev_label, "Prev");
    lv_obj_align(prev_label, LV_ALIGN_CENTER, 0, 0);

    lv_obj_t * next_btn = lv_btn_create(dip->main_screen);
    lv_obj_set_size(next_btn, 50, 50);
    lv_obj_set_pos(next_btn, 740, 130);  // 设置下一页按钮位置，右上角
    lv_obj_set_style_bg_color(next_btn, lv_color_hex(0x0000FF), LV_PART_MAIN);  // 设置背景为蓝色
    lv_obj_set_style_bg_opa(next_btn, LV_OPA_90, LV_PART_MAIN);  
    lv_obj_set_style_radius(next_btn, 25, LV_PART_MAIN);  

    lv_obj_t * next_label = lv_label_create(next_btn);  // 创建下一页按钮上的文本
    lv_label_set_text(next_label, "Next");
    lv_obj_align(next_label, LV_ALIGN_CENTER, 0, 0);

    /**************************/

    // if (Destroy_Dir_Btn_List(dip->dir_btn_inf_list_head) == false)
    // {
    //     printf("推毁目录按钮信息链表失败！\n");
    //     return;
    // }
    SI_P show_need = (SI_P)malloc(sizeof(SI));
    show_need->dip = dip;
    show_need->obj_dir_path = "/pic";
    show_need->btn_inf_node = btn_inf_node;

    // 为退出按钮添加点击事件
    lv_obj_add_event_cb(exit_btn_1, Show_Dir_List, LV_EVENT_CLICKED, show_need);
    // 为上一页按钮添加点击事件
    lv_obj_add_event_cb(prev_btn, Show_Next_Image, LV_EVENT_CLICKED, show_need);  
    // 为下一页按钮添加点击事件
    lv_obj_add_event_cb(next_btn, Show_Previous_Image, LV_EVENT_CLICKED, show_need);  
    

}

bool Destroy_Dir_Btn_List(BTN_LINK head)
{  // 销毁链表
    if (head == NULL) {  // 检查头节点是否为空
        printf("头节点异常！\n");
        return false;  // 如果头节点为空，返回false
    }

    // 定义一个存放即将释放的节点
    BTN_LINK free_node = (BTN_LINK)NULL;

    // 循环遍历链表，直到链表为空
    while (head->next != head) {
        free_node = head->next;  // 将 free_node 指向当前节点的下一个节点
        head->next = free_node->next;  // 断开当前节点与 free_node 的连接
        
        free_node->next->prev = head;
        
        free_node->next = free_node;  // 断开 free_node 的后续节点
        free_node->prev = free_node;

        // 释放 free_node 节点
        // printf("释放节点：%p\n", free_node);
        free(free_node);  // 释放内存
    }


    return true;  // 返回 true，表示链表销毁成功
}

void exit_btn_event_handler(lv_event_t * e)
{
    DI_P dip = (DI_P)e->user_data;  // 获取 user_data
    printf("退出按钮被点击！返回主界面...\n");
    lv_obj_clean(dip->main_screen);
    if (Destroy_Dir_Btn_List(dip->dir_btn_inf_list_head) == false)
    {
        printf("推毁目录按钮信息链表失败！\n");
        return;
    }else
    {
        printf("链表已经摧毁\n");
    }
    

    if(Show_Main_Screen(dip,DEFULT_DIR_PATH) == false)
    {
        printf("显示目录列表失败！\n");
        return false;
    }

    // 加载主界面
}

void Show_Previous_Image(lv_event_t * e)
{
    BTN_LINK prev_image_node = ((SI_P)e->user_data)->btn_inf_node->prev;
    printf("正在显示的图片：%s\n",prev_image_node->file_name);
    Show_Image(prev_image_node->file_name,((SI_P)e->user_data)->dip,prev_image_node);
}

void Show_Next_Image(lv_event_t * e)
{
    BTN_LINK next_image_node = ((SI_P)e->user_data)->btn_inf_node->next;
    printf("正在显示的图片：%s\n",next_image_node->file_name);
    
    Show_Image(next_image_node->file_name,((SI_P)e->user_data)->dip,next_image_node);
}

bool Demo_Free(DI_P dip)
{
    printf("例程结束释放成功！\n");
    return true;
}

